package com.jmj.patterns.demo0002;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author 良炫
 * @createTime 2022/3/4
 *
 *
 * 新增AbstractOrderService抽象类，是我们讲解的重点：
 *
 * 1，执行IOrderService接口
 *
 * 2，把createOrder()方法，从原来的两个运营商的订单子类中，移动到了父类中，并且添加了final修饰符（为什么？）
 *
 * 3，把lockMobile()方法，从原来的两个运营商的订单类中，移动到了父类中，也添加了final修饰符。
 *
 * 4，实现了identityVerification()方法，里面的代码，调用的是国家工信部提供的实名认证服务（这个方法为什么没有添加final修饰符？）。

 *
 */
public abstract class AbstractOrderService implements IOrderSerivce {
    private static final Logger lOG = LoggerFactory.getLogger(AbstractOrderService.class);

    /**
     * 个别运营商不提供实名认证服务，而是由我们狗厂调用工信部提供的接口服务
     * 钩子方法
     *
     * @author: 良炫
     * @date: 2022/3/10
     * @param:
     * @return:
     */
    @Override
    public boolean identityVerification(OrderInfo orderInfo) {
        lOG.info("第一步：实名认证，调用国家工信部提供的认证服务");
        return true;
    }

    @Override
    public final void lockMobile(OrderInfo orderInfo) {
        lOG.info("第三步：调用公司锁定号码服务");
    }

    @Override
    public final boolean createOrder(OrderInfo orderInfo) {
        boolean result = identityVerification(orderInfo);
        if (!result) {
            lOG.info("实名认证失败");
            return result;
        }
        result = fiveCardOnePerson(orderInfo);
        if (!result) {
            lOG.info("一证五号验证失败");
            return result;
        }
        lockMobile(orderInfo);
        if (!result) {
            lOG.info("号码锁定失败");
            return result;
        }
        result = sendOrder(orderInfo);
        if (!result) {
            lOG.info("发送订单信息失败");
            return result;
        }
        lOG.info("提交订单成功");
        return result;
    }
}
